
my_list = "This is a test string from Andrew".split()
print(my_list)

print(sorted(my_list, key=str.lower))

my_list.sort(key=str.lower)
print(my_list)


print('-' * 50)
student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]

#lambda表达式是一个匿名函数，增加写代码速度与可读性
print(sorted(student_tuples, key=lambda x: x[2]))


class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age
    def __repr__(self):
        """
        相对于__str__方法，__repr__方法可以返回非字符串，
        """
        return repr((self.name, self.grade, self.age))

student = Student('John', 'A', 15)
print('-' * 50)
print(student)

student_objects = [
    Student('john', 'A', 15),
    Student('jane', 'B', 12),
    Student('dave', 'B', 10),
]
print('-' * 50)
print(sorted(student_objects, key=lambda Student: Student.age))

from operator import itemgetter, attrgetter
print('使用operator模块')
print(sorted(student_tuples, key=itemgetter(0)))
print(sorted(student_objects, key=attrgetter('age')))
print('多列排序')
print(sorted(student_tuples, key=itemgetter(1, 2)))
print(sorted(student_tuples, key=lambda x: (x[1], -x[2])))
print(sorted(student_objects, key=attrgetter('grade', 'age'),reverse=True))


print('查看排序的稳定性')
data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
print(sorted(data, key=itemgetter(0)))


mydict = {  'Li'   : ['M',7],
            'Zhang': ['E',2],
            'Wang' : ['P',3],
            'Du'   : ['C',2],
            'Ma'   : ['C',9],
            'Zhe'  : ['H',7] }
print(sorted(mydict.items(), key=lambda x: x[1][1]))


gameresult = [
    { "name":"Bob", "wins":10, "losses":3, "rating":75.00 },
    { "name":"David", "wins":3, "losses":5, "rating":57.00 },
    { "name":"Carol", "wins":4, "losses":5, "rating":57.00 },
    { "name":"Patty", "wins":9, "losses":3, "rating": 71.48 }]
print('-' * 50)
print(sorted(gameresult, key=itemgetter('name', 'rating')))